import {DatabaseManager} from '../core/DatabaseManager';
import {ForeignKeyAction, SQLiteDataType} from './database';

/**
 * 数据库表的完整信息，用于生成表结构
 */
export interface TableInfo<T> {
  /**
   * 表名，对应SQLite中的表名称
   */
  name: string;

  /**
   * 主键列名（默认：'id'）
   * 如果未指定，但有某列的 primaryKey 属性为 true，则使用该列名
   */
  primaryKey?: string;

  /**
   * 列定义数组，包含表的所有列信息
   */
  columns: Record<keyof T, ColumnInfo>;

  /**
   * 索引定义数组，包含表的所有索引信息
   */
  indices?: IndexInfo[];

  /**
   * 数据库管理器
   */
  db: DatabaseManager;
}

/**
 * 数据库表列的完整信息
 */
export interface ColumnInfo {
  /**
   * 数据类型，如'INTEGER', 'TEXT', 'REAL', 'BLOB'等
   * SQLite支持的类型详见：https://www.sqlite.org/datatype3.html
   */
  type: SQLiteDataType;

  /**
   * 是否为主键
   * 如果为true，此列将成为表的主键
   */
  primaryKey?: boolean;

  /**
   * 是否添加NOT NULL约束
   * 如果为true，此列不允许NULL值
   */
  notNull?: boolean;

  /**
   * 是否添加UNIQUE约束
   * 如果为true，此列的值在表中必须唯一
   */
  unique?: boolean;

  /**
   * 列的默认值
   * 在插入时如果未提供值，使用此默认值
   */
  default?: any;

  /**
   * 是否自增（仅适用于INTEGER主键）
   * 如果为true，此列的值会自动递增
   */
  autoIncrement?: boolean;

  /**
   * 是否使用配置的ID生成策略自动生成ID
   * 当设置为true时，会根据数据库配置的ID生成策略生成ID
   */
  generateId?: boolean;

  /**
   * 外键引用信息，如果此列是外键引用
   */
  foreignKey?: ForeignKeyInfo;

  /**
   * 字段填充类型
   * 指定在什么操作时自动填充此字段
   */
  fillType?: FieldFillType;

  /**
   * 字段填充器
   * 用于自定义字段填充逻辑
   */
  filler?: FieldFiller;
  
  /**
   * 逻辑删除字段信息，如果此字段用于逻辑删除
   */
  logicalDelete?: LogicalDeleteInfo;
}

/**
 * 外键引用信息
 */
export interface ForeignKeyInfo {
  /**
   * 引用的表名
   */
  table: string;

  /**
   * 引用的列名
   */
  column: string;

  /**
   * 删除记录时的行为
   * - CASCADE：级联删除引用的记录
   * - RESTRICT：当引用的记录存在时阻止删除
   * - SET NULL：将引用字段设为NULL
   * - SET DEFAULT：将引用字段设为默认值
   */
  onDelete?: ForeignKeyAction;

  /**
   * 更新记录时的行为
   * - CASCADE：级联更新引用的记录
   * - RESTRICT：当引用的记录存在时阻止更新
   * - SET NULL：将引用字段设为NULL
   * - SET DEFAULT：将引用字段设为默认值
   */
  onUpdate?: ForeignKeyAction;
}

/**
 * 数据库表索引的完整信息
 */
export interface IndexInfo {
  /**
   * 索引名称，在数据库中必须唯一
   * 建议格式：idx_表名_列名（多列可用下划线连接）
   */
  name: string;

  /**
   * 是否为唯一索引
   * 如果为true，将创建UNIQUE INDEX，确保索引列组合的值唯一
   */
  unique?: boolean;

  /**
   * 索引包含的列名数组
   * 可以包含一个或多个列名，复合索引请按所需顺序排列列名
   */
  columns: string[];
}

/**
 * 数据库表的列信息
 */
export interface ColumnMetadata {
  /**
   * 列名
   */
  name: string;
  /**
   * 数据类型
   */
  type: string;
  /**
   * 是否为主键
   */
  pk: number;
  /**
   * 是否非空
   */
  notnull?: number;
  /**
   * 默认值
   */
  dflt_value?: string | null;
}

/**
 * 索引信息
 */
export interface IndexMetadata {
  /**
   * 索引名
   */
  name: string;
}

/**
 * 索引列信息
 */
export interface IndexColumnMetadata {
  /**
   * 列名
   */
  name: string;
}

/**
 * 字段填充类型
 */
export enum FieldFillType {
  // 仅插入时填充
  INSERT = 'INSERT',
  // 仅更新时填充
  UPDATE = 'UPDATE',
  // 插入和更新时都填充
  INSERT_UPDATE = 'INSERT_UPDATE'
}

/**
 * 字段填充器接口
 */
export interface FieldFiller {
  /**
   * 插入时填充字段值
   * @param entity 实体对象
   * @param field 字段名
   * @returns 填充后的值
   */
  fillInsert?(entity: any, field: string): any;

  /**
   * 更新时填充字段值
   * @param entity 实体对象
   * @param field 字段名
   * @returns 填充后的值
   */
  fillUpdate?(entity: any, field: string): any;
}

/**
 * 逻辑删除字段信息
 */
export interface LogicalDeleteInfo {
  /**
   * 标记为已删除的值
   */
  deletedValue?: any;

  /**
   * 标记为未删除的值
   */
  notDeletedValue?: any;
}
